using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._MaritimeTools
{
    /// <summary>
    /// <para>Reduce Point Density</para>
    /// <para>Thins points from a point or multipoint feature class.</para>
    /// <para>细化点或多点要素类中的点。</para>
    /// </summary>    
    [DisplayName("Reduce Point Density")]
    public class ReducePointDensity : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ReducePointDensity()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The input point or multipoint features.</para>
        /// <para>输入点或多点要素。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output feature class.</para>
        /// <para>输出要素类。</para>
        /// </param>
        /// <param name="_depth_field">
        /// <para>Depth Field</para>
        /// <para><xdoc>
        ///   <para>The field where the depth is stored. It is either a numeric field or the shape field specified in Input Features.
        ///   <para>For multipoint features, this must be the shape field.</para>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>存储深度的字段。它要么是数值字段，要么是在输入要素中指定的形状字段。
        ///   <para>对于多点要素，这必须是形状字段。</para>
        ///   </para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_depth_direction">
        /// <para>Depth Direction</para>
        /// <para><xdoc>
        ///   <para>Specifies how the depth value will be captured in the depth field of the input features.</para>
        ///   <bulletList>
        ///     <bullet_item>Positive Up—Depth values will be positive above the surface and negative below the surface. This is default.</bullet_item><para/>
        ///     <bullet_item>Positive Down—Depth values will be positive below the surface and negative above the surface.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何在输入要素的深度字段中捕获深度值。</para>
        ///   <bulletList>
        ///     <bullet_item>正向上—深度值在表面上方为正值，在表面下方为负值。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>正向下—深度值在曲面以下为正值，在曲面上方为负值。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_depth_bias">
        /// <para>Depth Selection Method</para>
        /// <para><xdoc>
        ///   <para>Specifies the bias that will be used to select the depths to be retained.</para>
        ///   <bulletList>
        ///     <bullet_item>Shallow Biased—Shallow bias will be used for depth. This is default.</bullet_item><para/>
        ///     <bullet_item>Deep Biased—Deep bias will be used for depth.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于选择要保留的深度的偏差。</para>
        ///   <bulletList>
        ///     <bullet_item>浅偏置 （Shallow Biased） - 浅偏置将用于深度。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>深度偏置—深度偏置将用于深度。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_radius_unit">
        /// <para>Thinning Radius Unit</para>
        /// <para><xdoc>
        ///   <para>Specifies the unit of measure that will be used by the Start Thinning Radius and End Thinning Radius parameters.</para>
        ///   <bulletList>
        ///     <bullet_item>Kilometers—The radius unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Meters—The radius unit will be meters. This is default.</bullet_item><para/>
        ///     <bullet_item>Decimeters—The radius unit will be decimeters.</bullet_item><para/>
        ///     <bullet_item>Centimeters—The radius unit will be centimeters.</bullet_item><para/>
        ///     <bullet_item>Millimeters—The radius unit will be millimeters.</bullet_item><para/>
        ///     <bullet_item>Nautical Miles—The radius unit will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Miles—The radius unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Yards—The radius unit will be yards.</bullet_item><para/>
        ///     <bullet_item>Feet—The radius unit will be feet.</bullet_item><para/>
        ///     <bullet_item>Inches—The radius unit will be inches.</bullet_item><para/>
        ///     <bullet_item>Decimal Degrees—The radius unit will be decimal degrees.</bullet_item><para/>
        ///     <bullet_item>Points—The radius unit will be points.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定“开始变薄半径”和“结束变细半径”参数将使用的度量单位。</para>
        ///   <bulletList>
        ///     <bullet_item>千米—半径单位将为千米。</bullet_item><para/>
        ///     <bullet_item>米—半径单位将为米。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>分米—半径单位为分米。</bullet_item><para/>
        ///     <bullet_item>厘米—半径单位将为厘米。</bullet_item><para/>
        ///     <bullet_item>毫米—半径单位将为毫米。</bullet_item><para/>
        ///     <bullet_item>海里—半径单位为海里。</bullet_item><para/>
        ///     <bullet_item>英里—半径单位将为英里。</bullet_item><para/>
        ///     <bullet_item>码—半径单位将为码。</bullet_item><para/>
        ///     <bullet_item>英尺—半径单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>英寸—半径单位将为英寸。</bullet_item><para/>
        ///     <bullet_item>十进制度—半径单位为十进制度。</bullet_item><para/>
        ///     <bullet_item>点—半径单位将为点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_start_thinning_radius">
        /// <para>Start Thinning Radius</para>
        /// <para>The beginning radius that will be used to remove or thin points relative to each other.</para>
        /// <para>将用于相对于彼此删除或细化点的起始半径。</para>
        /// </param>
        public ReducePointDensity(object _in_features, object _out_feature_class, object _depth_field, _depth_direction_value _depth_direction, _depth_bias_value _depth_bias, _radius_unit_value _radius_unit, double? _start_thinning_radius)
        {
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
            this._depth_field = _depth_field;
            this._depth_direction = _depth_direction;
            this._depth_bias = _depth_bias;
            this._radius_unit = _radius_unit;
            this._start_thinning_radius = _start_thinning_radius;
        }
        public override string ToolboxName => "Maritime Tools";

        public override string ToolName => "Reduce Point Density";

        public override string CallName => "maritime.ReducePointDensity";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_features, _out_feature_class, _depth_field, _depth_direction.GetGPValue(), _depth_bias.GetGPValue(), _radius_unit.GetGPValue(), _start_thinning_radius, _end_thinning_radius, _start_depth, _end_depth];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The input point or multipoint features.</para>
        /// <para>输入点或多点要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output feature class.</para>
        /// <para>输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Depth Field</para>
        /// <para><xdoc>
        ///   <para>The field where the depth is stored. It is either a numeric field or the shape field specified in Input Features.
        ///   <para>For multipoint features, this must be the shape field.</para>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>存储深度的字段。它要么是数值字段，要么是在输入要素中指定的形状字段。
        ///   <para>对于多点要素，这必须是形状字段。</para>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Depth Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _depth_field { get; set; }


        /// <summary>
        /// <para>Depth Direction</para>
        /// <para><xdoc>
        ///   <para>Specifies how the depth value will be captured in the depth field of the input features.</para>
        ///   <bulletList>
        ///     <bullet_item>Positive Up—Depth values will be positive above the surface and negative below the surface. This is default.</bullet_item><para/>
        ///     <bullet_item>Positive Down—Depth values will be positive below the surface and negative above the surface.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何在输入要素的深度字段中捕获深度值。</para>
        ///   <bulletList>
        ///     <bullet_item>正向上—深度值在表面上方为正值，在表面下方为负值。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>正向下—深度值在曲面以下为正值，在曲面上方为负值。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Depth Direction")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _depth_direction_value _depth_direction { get; set; }

        public enum _depth_direction_value
        {
            /// <summary>
            /// <para>Positive Up</para>
            /// <para>Positive Up—Depth values will be positive above the surface and negative below the surface. This is default.</para>
            /// <para>正向上—深度值在表面上方为正值，在表面下方为负值。这是默认设置。</para>
            /// </summary>
            [Description("Positive Up")]
            [GPEnumValue("POSITIVE_UP")]
            _POSITIVE_UP,

            /// <summary>
            /// <para>Positive Down</para>
            /// <para>Positive Down—Depth values will be positive below the surface and negative above the surface.</para>
            /// <para>正向下—深度值在曲面以下为正值，在曲面上方为负值。</para>
            /// </summary>
            [Description("Positive Down")]
            [GPEnumValue("POSITIVE_DOWN")]
            _POSITIVE_DOWN,

        }

        /// <summary>
        /// <para>Depth Selection Method</para>
        /// <para><xdoc>
        ///   <para>Specifies the bias that will be used to select the depths to be retained.</para>
        ///   <bulletList>
        ///     <bullet_item>Shallow Biased—Shallow bias will be used for depth. This is default.</bullet_item><para/>
        ///     <bullet_item>Deep Biased—Deep bias will be used for depth.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于选择要保留的深度的偏差。</para>
        ///   <bulletList>
        ///     <bullet_item>浅偏置 （Shallow Biased） - 浅偏置将用于深度。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>深度偏置—深度偏置将用于深度。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Depth Selection Method")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _depth_bias_value _depth_bias { get; set; }

        public enum _depth_bias_value
        {
            /// <summary>
            /// <para>Shallow Biased</para>
            /// <para>Shallow Biased—Shallow bias will be used for depth. This is default.</para>
            /// <para>浅偏置 （Shallow Biased） - 浅偏置将用于深度。这是默认设置。</para>
            /// </summary>
            [Description("Shallow Biased")]
            [GPEnumValue("SHALLOW_BIASED")]
            _SHALLOW_BIASED,

            /// <summary>
            /// <para>Deep Biased</para>
            /// <para>Deep Biased—Deep bias will be used for depth.</para>
            /// <para>深度偏置—深度偏置将用于深度。</para>
            /// </summary>
            [Description("Deep Biased")]
            [GPEnumValue("DEEP_BIASED")]
            _DEEP_BIASED,

        }

        /// <summary>
        /// <para>Thinning Radius Unit</para>
        /// <para><xdoc>
        ///   <para>Specifies the unit of measure that will be used by the Start Thinning Radius and End Thinning Radius parameters.</para>
        ///   <bulletList>
        ///     <bullet_item>Kilometers—The radius unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Meters—The radius unit will be meters. This is default.</bullet_item><para/>
        ///     <bullet_item>Decimeters—The radius unit will be decimeters.</bullet_item><para/>
        ///     <bullet_item>Centimeters—The radius unit will be centimeters.</bullet_item><para/>
        ///     <bullet_item>Millimeters—The radius unit will be millimeters.</bullet_item><para/>
        ///     <bullet_item>Nautical Miles—The radius unit will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Miles—The radius unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Yards—The radius unit will be yards.</bullet_item><para/>
        ///     <bullet_item>Feet—The radius unit will be feet.</bullet_item><para/>
        ///     <bullet_item>Inches—The radius unit will be inches.</bullet_item><para/>
        ///     <bullet_item>Decimal Degrees—The radius unit will be decimal degrees.</bullet_item><para/>
        ///     <bullet_item>Points—The radius unit will be points.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定“开始变薄半径”和“结束变细半径”参数将使用的度量单位。</para>
        ///   <bulletList>
        ///     <bullet_item>千米—半径单位将为千米。</bullet_item><para/>
        ///     <bullet_item>米—半径单位将为米。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>分米—半径单位为分米。</bullet_item><para/>
        ///     <bullet_item>厘米—半径单位将为厘米。</bullet_item><para/>
        ///     <bullet_item>毫米—半径单位将为毫米。</bullet_item><para/>
        ///     <bullet_item>海里—半径单位为海里。</bullet_item><para/>
        ///     <bullet_item>英里—半径单位将为英里。</bullet_item><para/>
        ///     <bullet_item>码—半径单位将为码。</bullet_item><para/>
        ///     <bullet_item>英尺—半径单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>英寸—半径单位将为英寸。</bullet_item><para/>
        ///     <bullet_item>十进制度—半径单位为十进制度。</bullet_item><para/>
        ///     <bullet_item>点—半径单位将为点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Thinning Radius Unit")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _radius_unit_value _radius_unit { get; set; }

        public enum _radius_unit_value
        {
            /// <summary>
            /// <para>Kilometers</para>
            /// <para>Kilometers—The radius unit will be kilometers.</para>
            /// <para>千米—半径单位将为千米。</para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("KILOMETERS")]
            _KILOMETERS,

            /// <summary>
            /// <para>Meters</para>
            /// <para>Meters—The radius unit will be meters. This is default.</para>
            /// <para>米—半径单位将为米。这是默认设置。</para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("METERS")]
            _METERS,

            /// <summary>
            /// <para>Decimeters</para>
            /// <para>Decimeters—The radius unit will be decimeters.</para>
            /// <para>分米—半径单位为分米。</para>
            /// </summary>
            [Description("Decimeters")]
            [GPEnumValue("DECIMETERS")]
            _DECIMETERS,

            /// <summary>
            /// <para>Centimeters</para>
            /// <para>Centimeters—The radius unit will be centimeters.</para>
            /// <para>厘米—半径单位将为厘米。</para>
            /// </summary>
            [Description("Centimeters")]
            [GPEnumValue("CENTIMETERS")]
            _CENTIMETERS,

            /// <summary>
            /// <para>Millimeters</para>
            /// <para>Millimeters—The radius unit will be millimeters.</para>
            /// <para>毫米—半径单位将为毫米。</para>
            /// </summary>
            [Description("Millimeters")]
            [GPEnumValue("MILLIMETERS")]
            _MILLIMETERS,

            /// <summary>
            /// <para>Nautical Miles</para>
            /// <para>Nautical Miles—The radius unit will be nautical miles.</para>
            /// <para>海里—半径单位为海里。</para>
            /// </summary>
            [Description("Nautical Miles")]
            [GPEnumValue("NAUTICAL_MILES")]
            _NAUTICAL_MILES,

            /// <summary>
            /// <para>Miles</para>
            /// <para>Miles—The radius unit will be miles.</para>
            /// <para>英里—半径单位将为英里。</para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("MILES")]
            _MILES,

            /// <summary>
            /// <para>Yards</para>
            /// <para>Yards—The radius unit will be yards.</para>
            /// <para>码—半径单位将为码。</para>
            /// </summary>
            [Description("Yards")]
            [GPEnumValue("YARDS")]
            _YARDS,

            /// <summary>
            /// <para>Feet</para>
            /// <para>Feet—The radius unit will be feet.</para>
            /// <para>英尺—半径单位将为英尺。</para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("FEET")]
            _FEET,

            /// <summary>
            /// <para>Inches</para>
            /// <para>Inches—The radius unit will be inches.</para>
            /// <para>英寸—半径单位将为英寸。</para>
            /// </summary>
            [Description("Inches")]
            [GPEnumValue("INCHES")]
            _INCHES,

            /// <summary>
            /// <para>Decimal Degrees</para>
            /// <para>Decimal Degrees—The radius unit will be decimal degrees.</para>
            /// <para>十进制度—半径单位为十进制度。</para>
            /// </summary>
            [Description("Decimal Degrees")]
            [GPEnumValue("DECIMAL_DEGREES")]
            _DECIMAL_DEGREES,

            /// <summary>
            /// <para>Points</para>
            /// <para>Points—The radius unit will be points.</para>
            /// <para>点—半径单位将为点。</para>
            /// </summary>
            [Description("Points")]
            [GPEnumValue("POINTS")]
            _POINTS,

        }

        /// <summary>
        /// <para>Start Thinning Radius</para>
        /// <para>The beginning radius that will be used to remove or thin points relative to each other.</para>
        /// <para>将用于相对于彼此删除或细化点的起始半径。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start Thinning Radius")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _start_thinning_radius { get; set; }


        /// <summary>
        /// <para>End Thinning Radius</para>
        /// <para>The end radius that will be used to remove or thin points relative to each other. The thinning radius will dynamically change as the algorithm progresses through the range of depth values.</para>
        /// <para>将用于移除或细化彼此相对的点的端半径。随着算法在深度值范围内的进展，变细半径将动态变化。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("End Thinning Radius")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _end_thinning_radius { get; set; } = null;


        /// <summary>
        /// <para>Start Depth</para>
        /// <para>The depth that will be used to begin the thinning algorithm. Depth values that appear before this depth based on the Depth Direction parameter value will be ignored.</para>
        /// <para>将用于开始细化算法的深度。基于“深度方向”参数值出现在此深度之前的深度值将被忽略。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start Depth")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _start_depth { get; set; } = null;


        /// <summary>
        /// <para>End Depth</para>
        /// <para>The depth that will be used to end the thinning algorithm. Depth values that appear after this depth based on the Depth Direction parameter value will be ignored.</para>
        /// <para>将用于结束细化算法的深度。基于“深度方向”参数值在此深度之后显示的深度值将被忽略。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("End Depth")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _end_depth { get; set; } = null;


        public ReducePointDensity SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}